package Java2Test.mythread.waitandnotify;

public class Foodie extends Thread {

    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock) {
                // 1. 总资源计数检查：决定是否终止整个消费流程
                if (Desk.count == 0) {
                    break; // 吃货已经吃饱，退出循环
                } else {
                    // 2. 状态标志检查：决定当前是否可以消费
                    if (Desk.foodFlag == 0) {
                        try {
                            // 2.1 没有面条时，当前线程释放锁并进入等待队列
                            // 等待厨师线程制作面条后唤醒
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        // 3. 执行消费操作
                        Desk.count--; // 减少总资源计数
                        System.out.println("吃货在吃面条, 还能再吃" + Desk.count + "碗面条");

                        // 4. 关键同步点：
                        // 4.1 唤醒可能在等待的厨师线程（即使当前没有厨师线程等待也无害）
                        Desk.lock.notifyAll();

                        // 4.2 立即重置状态标志，表示当前面条已被消费
                        // 这一步必须与notifyAll()配合：
                        // - 先唤醒其他线程，再修改状态
                        // - 确保厨师线程醒来后能正确判断状态
                        Desk.foodFlag = 0;
                    }
                }
            }
        }
    }
}